package pe.gob.osce.sirenas.svc;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.NoResultException;
import javax.persistence.Query;

import org.apache.log4j.Logger;

import pe.gob.osce.sirenas.dao.ComunicacionesDAOLocal;
import pe.gob.osce.sirenas.dao.DistritoDAOLocal;
import pe.gob.osce.sirenas.dao.DomicilioDAOLocal;
import pe.gob.osce.sirenas.dao.HojaVidaDAOLocal;
import pe.gob.osce.sirenas.dao.PersonaDAOLocal;
import pe.gob.osce.sirenas.dao.ProvinciaDAOLocal;
import pe.gob.osce.sirenas.dao.RegionDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AuditoriaConvert;
import pe.gob.osce.sirenas.dao.convert.CapacitacionConvert;
import pe.gob.osce.sirenas.dao.convert.ComunicacionesConvert;
import pe.gob.osce.sirenas.dao.convert.DomicilioConvert;
import pe.gob.osce.sirenas.dao.convert.HojaVidaConvert;
import pe.gob.osce.sirenas.dao.convert.PersonaConvert;
import pe.gob.osce.sirenas.model.AuditoriaDTO;
import pe.gob.osce.sirenas.model.CapacitacionDTO;
import pe.gob.osce.sirenas.model.ComunicacionesDTO;
import pe.gob.osce.sirenas.model.DistritoDTO;
import pe.gob.osce.sirenas.model.DomicilioDTO;
import pe.gob.osce.sirenas.model.HojaVidaDTO;
import pe.gob.osce.sirenas.model.PersonaDTO;
import pe.gob.osce.sirenas.model.ProvinciaDTO;
import pe.gob.osce.sirenas.model.RegionDTO;
import pe.gob.osce.sirenas.model.jpa.Auditoria;
import pe.gob.osce.sirenas.model.jpa.Capacitacion;
import pe.gob.osce.sirenas.model.jpa.Comunicaciones;
import pe.gob.osce.sirenas.model.jpa.Domicilio;
import pe.gob.osce.sirenas.model.jpa.HojaVida;
import pe.gob.osce.sirenas.model.jpa.Persona;
import pe.gob.osce.sirenas.model.jpa.rectificaciones.HistorialPersona;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;


/**
 * Session Bean implementation class SolicitarInscripcionService
 */
@Stateless(mappedName = "RegistrarDatosPersonalesService")
public class RegistrarDatosPersonalesServiceImpl implements RegistrarDatosPersonalesServiceLocal {
	final static Logger log = Logger.getLogger(RegistrarDatosPersonalesServiceImpl.class);

	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);
	@EJB
	private	PersonaDAOLocal	personaDAOLocal;
	@EJB
	private	DomicilioDAOLocal  domicilioDAOLocal;
	@EJB
	private RegionDAOLocal regionDAOLocal;
	@EJB
	private ProvinciaDAOLocal provinciaDAOLocal;
	@EJB
	private DistritoDAOLocal distritoDAOLocal;
	@EJB
	private ComunicacionesDAOLocal comunicacionesDAOLocal;
	@EJB
	private HojaVidaDAOLocal hojaVidaDAOLocal;
	
	@Override
	public	PersonaDTO guardarPersona( PersonaDTO personaDTO,AuditoriaDTO auditoriaDTO)
			throws Exception {
		Persona		personaJPA=null;
		Persona		personaAlHistorialJPA=null;
		HistorialPersona		historialPersonaJPA=null;
		boolean		confirmacion=false;
		Auditoria auditoriaJPA=null;
		
		try{
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			
			if(personaDTO.getIdModificado()!=0)
			{
				personaAlHistorialJPA=personaDAOLocal.consultarPersona(personaDTO.getIdModificado());		
				historialPersonaJPA=PersonaConvert.createHistorialPersonaJPA(personaAlHistorialJPA, auditoriaJPA);			
				confirmacion=personaDAOLocal.insertarHistorialPersona(historialPersonaJPA);
			}
			/* Insertar Solicitud */
			personaJPA= PersonaConvert.createJPA(personaDTO,auditoriaJPA);
			personaJPA= personaDAOLocal.insertar(personaJPA);
			/* OBTENER ESTRUCTURA DE LO GUARDADO */
			personaDTO= PersonaConvert.createDTO(personaJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return personaDTO;
	}
	
	@Override
	public	DomicilioDTO guardarDomicilio(DomicilioDTO domicilioDTO,AuditoriaDTO auditoriaDTO)
			throws Exception {
		Domicilio		domicilioJPA=null;
		Auditoria auditoriaJPA=null;		
		try{
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			/* Insertar Solicitud */
			domicilioJPA= DomicilioConvert.createJPA(domicilioDTO,auditoriaJPA);
			domicilioJPA= domicilioDAOLocal.insertar(domicilioJPA);
			/* OBTENER ESTRUCTURA DE LO GUARDADO */
			domicilioDTO= DomicilioConvert.createDTO(domicilioJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return domicilioDTO;
	}
	
	@Override
	public PersonaDTO actualizarPersona(PersonaDTO personaDTO,
			AuditoriaDTO auditoriaDTO) throws Exception {
		Persona		personaJPA=null;
		Persona		personaAlHistorialJPA=null;
		HistorialPersona		historialPersonaJPA=null;
		boolean		confirmacion=false;
		Auditoria auditoriaJPA=null;
		
		try{
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			if(personaDTO.getIdModificado()!=0)
			{
				personaAlHistorialJPA=personaDAOLocal.consultarPersona(personaDTO.getIdModificado());		
				historialPersonaJPA=PersonaConvert.createHistorialPersonaJPA(personaAlHistorialJPA, auditoriaJPA);			
				confirmacion=personaDAOLocal.insertarHistorialPersona(historialPersonaJPA);
			}
			/* Actualizar Persona */
			personaJPA= PersonaConvert.createJPA(personaDTO,auditoriaJPA);
			personaJPA= personaDAOLocal.actualizar(personaJPA);
			/* OBTENER ESTRUCTURA DE LO GUARDADO */
			personaDTO= PersonaConvert.createDTO(personaJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return personaDTO;
	}
	
	@Override
	public DomicilioDTO actualizarDomicilio(DomicilioDTO domicilioDTO,
			AuditoriaDTO auditoriaDTO) throws Exception {
		Domicilio		domicilioJPA=null;
		Auditoria auditoriaJPA=null;
		Domicilio		domicilioHistorialJPA=null;
		try{
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			/* Actualizar Domicilio */
			if(domicilioDTO.getIdModificado()!=Long.parseLong(propSirenas.getString(ConstanteEJB.VALORCERO)))
			{
				domicilioHistorialJPA=domicilioDAOLocal.consultarDomicilio(domicilioDTO.getIdModificado());
				domicilioHistorialJPA.setEstado(Long.parseLong(propSirenas.getString(ConstanteEJB.VALORCERO)));
				domicilioJPA= domicilioDAOLocal.actualizar(domicilioHistorialJPA);
				domicilioDTO.setIdDomicilio(null);
			}
			
			domicilioJPA= DomicilioConvert.createJPA(domicilioDTO,auditoriaJPA);
			domicilioJPA= domicilioDAOLocal.insertar(domicilioJPA);
			/* OBTENER ESTRUCTURA DE LO GUARDADO */
			domicilioDTO= DomicilioConvert.createDTO(domicilioJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return domicilioDTO;
	}
	
	@Override
	public	List<RegionDTO> listarRegion()
			throws Exception {
		List<RegionDTO> listaRegion = null;
	
		try{
			
			listaRegion=regionDAOLocal.ListarRegion();
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return listaRegion;
	}
	
	@Override
	public	List<ProvinciaDTO> listarProvincia()
			throws Exception {
		List<ProvinciaDTO> listaProvincia = null;
	
		try{
			
			listaProvincia = provinciaDAOLocal.ListarProvincia();
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return listaProvincia;
	}
	
	@Override
	public	List<DistritoDTO> listarDistrito()
			throws Exception {
		List<DistritoDTO> listaDistrito = null;
	
		try{
			
			listaDistrito = distritoDAOLocal.ListarDistrito();
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return listaDistrito;
	}
	
	
	
	@Override
	public	ComunicacionesDTO guardarComunicaciones(ComunicacionesDTO comunicacionesDTO,AuditoriaDTO auditoriaDTO)
			throws Exception {
		Comunicaciones	comunicacionesJPA=null;
		Comunicaciones	comunicacionesModificadoJPA=null;
		Auditoria auditoriaJPA=null;		
		try{
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			
			if(comunicacionesDTO.getIdModificado() !=Long.parseLong(propSirenas.getString(ConstanteEJB.VALORCERO)))
			{
				comunicacionesModificadoJPA=comunicacionesDAOLocal.consultarComunicacion(comunicacionesDTO.getIdPersona(), comunicacionesDTO.getIndTipoComunicacion());
				comunicacionesModificadoJPA.setEstado(Long.parseLong(propSirenas.getString(ConstanteEJB.VALORCERO)));
				comunicacionesJPA= comunicacionesDAOLocal.insertar(comunicacionesModificadoJPA);
				comunicacionesDTO.setIdComunicaciones(null);
			}
			
			/* Insertar Solicitud */
			
			comunicacionesJPA= ComunicacionesConvert.createJPA(comunicacionesDTO,auditoriaJPA);
			comunicacionesJPA= comunicacionesDAOLocal.insertar(comunicacionesJPA);
			/* OBTENER ESTRUCTURA DE LO GUARDADO */
			comunicacionesDTO= ComunicacionesConvert.createDTO(comunicacionesJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return comunicacionesDTO;
	}
	
	@Override
	public	HojaVidaDTO guardarHojaVida(HojaVidaDTO hojaVidaDTO,AuditoriaDTO auditoriaDTO)
			throws Exception {
		HojaVida hojaVidaJPA=null;
		Auditoria auditoriaJPA=null;		
		try{
			auditoriaJPA=AuditoriaConvert.createJPA(auditoriaDTO);
			/* Insertar Solicitud */
			hojaVidaJPA= HojaVidaConvert.createJPA(hojaVidaDTO,auditoriaJPA);
			hojaVidaJPA= hojaVidaDAOLocal.insertar(hojaVidaJPA);
			/* OBTENER ESTRUCTURA DE LO GUARDADO */
			hojaVidaDTO= HojaVidaConvert.createDTO(hojaVidaJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return hojaVidaDTO;
	}

	@Override
	public PersonaDTO obtenerPersona(PersonaDTO personaDTO) throws Exception {
		try{
			personaDTO=personaDAOLocal.obtenerPersona(personaDTO.getIdPersona(),personaDTO.getNumRuc(),personaDTO.getNumDocumento());
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return personaDTO;
	}

	@Override
	public List<HojaVidaDTO> obtenerListaHojaVida(PersonaDTO personaDTO) throws Exception {
		return hojaVidaDAOLocal.obtenerListaHojaVida(personaDTO.getIdPersona());
	}

	@Override
	public void registrarNuevaHojaVida(HojaVidaDTO hojaVidaDTO,AuditoriaDTO auditoriaDTO) throws Exception {
		try{
			hojaVidaDAOLocal.inacticaHojaVidaPersona(hojaVidaDTO.getIdPersona(), auditoriaDTO.getUsuarioRegistro());
			
			HojaVida hojaVidaJPA=HojaVidaConvert.createJPA(hojaVidaDTO, AuditoriaConvert.createJPA(auditoriaDTO));
			
			hojaVidaDAOLocal.insertar(hojaVidaJPA );
		
		} catch (ModeloException e) {
			throw new Exception(e.getMessage(),e);
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB),e);
		}
		
	}
	
	@Override
	public DomicilioDTO obtenerDomicilio(DomicilioDTO domicilioDTO) throws Exception {
		try{
			domicilioDTO=personaDAOLocal.obtenerDomicilio(domicilioDTO.getIdPersona());
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return domicilioDTO;
	}

	@Override
	public ComunicacionesDTO consultarComunicacion(Long idPersona, Long indTipoComunicacion) throws Exception {
		ComunicacionesDTO comunicacionesDTO= null;
		Comunicaciones comunicacionesJPA= null;
		try{
			comunicacionesJPA=comunicacionesDAOLocal.consultarComunicacion(idPersona, indTipoComunicacion);
			comunicacionesDTO=ComunicacionesConvert.createDTO(comunicacionesJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return comunicacionesDTO;
	}

	@Override
	public ComunicacionesDTO obtenerComunicacionId(Long idComunicacion) throws Exception {
		ComunicacionesDTO comunicacionesDTO= null;
		Comunicaciones comunicacionesJPA= null;
		try{
			comunicacionesJPA=comunicacionesDAOLocal.obtenterComunicacionId(idComunicacion);
			comunicacionesDTO=ComunicacionesConvert.createDTO(comunicacionesJPA);
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return comunicacionesDTO;
	}
	
	@Override
	public List<PersonaDTO> consultarRectificacionesPersona(Long idPersona) throws Exception {
		List<PersonaDTO> listaPersonaDTO= null;
		List<Persona> listaPersonaJPA=null;
		List<HistorialPersona> listaHistorialPersonaJPA=null;
		try{
			listaHistorialPersonaJPA=personaDAOLocal.consultarRectificacionesPersona(idPersona);			
			listaPersonaDTO=PersonaConvert.createListHistorialPersonaDTO(listaHistorialPersonaJPA);
			
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return listaPersonaDTO;
	}
	
	@Override
	public List<ComunicacionesDTO> consultarRectificacionesComunicacion(Long idPersona) throws Exception {
		List<ComunicacionesDTO> listaHistorialComunicacionesDTO= null;
		List<Comunicaciones> listaComunicacionesJPA=null;
		
		try{
			listaComunicacionesJPA=comunicacionesDAOLocal.consultaHistorialComunicaciones(idPersona);
			listaHistorialComunicacionesDTO=ComunicacionesConvert.createListHistorialComunicacionesDTO(listaComunicacionesJPA);
			
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return listaHistorialComunicacionesDTO;
	}
	
	@Override
	public List<DomicilioDTO> consultarRectificacionesDomicilio(Long idPersona) throws Exception {
		List<DomicilioDTO> listaHistorialDomicilioDTO= null;
		List<Domicilio> listaDomicilioJPA=null;
		
		try{
			listaDomicilioJPA=domicilioDAOLocal.consultarHistorialDomicilio(idPersona);
			listaHistorialDomicilioDTO=DomicilioConvert.createListHistorialDomicilioDTO(listaDomicilioJPA);
			
			
		}  catch (Exception e) {
			log.error(e.getMessage(), e);
		}
			
		return listaHistorialDomicilioDTO;
	}
	
}
